#ifndef GPIO_H
#define GPIO_H

#define GPIO_PIN_VALUE_INTERNAL(port,pin)               P##port##pin##D
#define GPIO_PIN_VALUE(port,pin)                        GPIO_PIN_VALUE_INTERNAL(port,pin)
#define GPIO_PIN_VALUE_LOW                              0
#define GPIO_PIN_VALUE_HIGH                             1
#define GPIO_PIN_SET_VALUE(port,pin,value)              GPIO_PIN_VALUE(port,pin) = (value)
#define GPIO_PIN_GET_VALUE(port,pin)                    GPIO_PIN_VALUE(port,pin)

#define GPIO_PIN_DIRECTION_INTERNAL(port,pin)           P##port##pin##OE
#define GPIO_PIN_DIRECTION(port,pin)                    GPIO_PIN_DIRECTION_INTERNAL(port,pin) 
#define GPIO_PIN_DIRECTION_INPUT                        0
#define GPIO_PIN_DIRECTION_OUTPUT                       1
#define GPIO_PIN_SET_DIRECTION(port,pin,direction)      GPIO_PIN_DIRECTION(port,pin) = (direction)
#define GPIO_PIN_GET_DIRECTION(port,pin)                GPIO_PIN_DIRECTION(port,pin)

#define GPIO_PIN_PULLUP_INTERNAL(port,pin)              P##port##pin##PU
#define GPIO_PIN_PULLUP(port,pin)                       GPIO_PIN_PULLUP_INTERNAL(port,pin) 
#define GPIO_PIN_PULLUP_DISABLE                         0
#define GPIO_PIN_PULLUP_ENABLE                          1
#define GPIO_PIN_SET_PULLUP(port,pin,pu)                GPIO_PIN_PULLUP(port,pin) = (pu)
#define GPIO_PIN_GET_PULLUP(port,pin)                   GPIO_PIN_PULLUP(port,pin)

#define GPIO_PIN_PULLDOWN_INTERNAL(port,pin)            P##port##pin##PD
#define GPIO_PIN_PULLDOWN(port,pin)                     GPIO_PIN_PULLDOWN_INTERNAL(port,pin) 
#define GPIO_PIN_PULLDOWN_DISABLE                       0
#define GPIO_PIN_PULLDOWN_ENABLE                        1
#define GPIO_PIN_SET_PULLDOWN(port,pin,pd)              GPIO_PIN_PULLDOWN(port,pin) = (pd)
#define GPIO_PIN_GET_PULLDOWN(port,pin)                 GPIO_PIN_PULLDOWN(port,pin)

#define GPIO_PIN_ANALOG_INTERNAL(port,pin)              P##port##pin##ANS
#define GPIO_PIN_ANALOG(port,pin)                       GPIO_PIN_ANALOG_INTERNAL(port,pin) 
#define GPIO_PIN_ANALOG_DISABLE                         0
#define GPIO_PIN_ANALOG_ENABLE                          1
#define GPIO_PIN_SET_ANALOG(port,pin,analog)            GPIO_PIN_ANALOG(port,pin) = (analog)
#define GPIO_PIN_GET_ANALOG(port,pin)                   GPIO_PIN_ANALOG(port,pin)


#define GPIO_Pother_POWER_WEAK                          0
#define GPIO_Pother_POWER_STRONG                        1
#define GPIO_Pother_POWER_SET(value)                    DRVS = (value)
#define GPIO_Pother_POWER_GET()                         DRVS
#define GPIO_P00_POWER_WEAK                             0
#define GPIO_P00_POWER_STRONG                           1
#define GPIO_P00_POWER_SET(value)                       LDRVS = (value)
#define GPIO_P00_POWER_GET()                            LDRVS
#define GPIO_p1617_POWER_STRENGTH_25MA                  0
#define GPIO_p1617_POWER_STRENGTH_50MA                  1
#define GPIO_p1617_POWER_STRENGTH_75MA                  2
#define GPIO_p1617_POWER_STRENGTH_100MA                 3
#define GPIO_P1617_POWER_STRENGTH_SET(value)            PDRVS1 = (((value)>>1)&1);PDRVS0 = ((value)&1)
#define GPIO_P1617_POWER_STRENGTH_GET()                 ((PDRVS1<<1) | PDRVS0)
#define GPIO_P1617_POWER_PREVIOUS_10NS                  0
#define GPIO_P1617_POWER_PREVIOUS_50NS                  1
#define GPIO_P1617_POWER_PREVIOUS_DISABLE               2
#define GPIO_P1617_POWER_PREVIOUS_SET(value)            PDLYS1 = (((value)>>1)&1);PDLYS0 = ((value)&1)
#define GPIO_P1617_POWER_PREVIOUS_GET()                 ((PDLYS1<<1) | PDLYS0)
#define GPIO_P1617_POWER_SPEED_10NS                     0
#define GPIO_P1617_POWER_SPEED_50NS                     1
#define GPIO_P1617_POWER_SPEED_DISABLE                  2
#define GPIO_P1617_POWER_SPEED_SET(value)               PSPDS1 = (((value)>>1)&1);PSPDS0 = ((value)&1)
#define GPIO_P1617_POWER_SPEED_GET()                    ((PSPDS1<<1) | PSPDS0)

#endif